/**    
* @文件名: CommonService.java  
* @包名 cn.com.gzheroli.core.common.service  
* @描述: TODO(用一句话描述该文件做什么)  
* @作者 李长荣  lichang_20011@163.com   
* @日期 2016年10月17日 上午10:18:34  
* @version V1.0    
*/
package cn.com.gzheroli.core.common.service;

import java.io.Serializable;
import java.util.List;
import java.util.Map;



import cn.com.gzheroli.core.common.model.common.UploadFile;
import cn.com.gzheroli.core.common.model.json.ImportFile;
import cn.com.gzheroli.core.common.model.json.TreeGrid;
import cn.com.gzheroli.tag.core.DataGrid;
import cn.com.gzheroli.tag.vo.easyui.TreeGridModel;

/**  
* @类名: CommonService  
* @描述: TODO(这里用一句话描述这个类的作用)  
* @作者: 李长荣 lichang_20011@163.com  
* @日期: 2016年10月17日 上午10:18:34  
*    
*/
public interface CommonService {
	/**
	 * 根据实体名称和主键获取实体
	 * 
	 * @param <T>
	 * @param entityName
	 * @param id
	 * @return
	 */
	public <T> T getEntity(Class<T>  entityName, Serializable id);
	/**
	 * 
	 * @param sql
	 * @param entityName
	 * @param id
	 * @return
	 */
	//public <T> T getEntity(SQL sql,Class<T>  entityName, Serializable id);
	/**
	 * 根据实体名称和字段名称和字段值获取唯一记录
	 * 
	 * @param <T>
	 * @param entityClass
	 * @param propertyName
	 * @param value
	 * @return
	 */
	public <T> T findUniqueByProperty(Class<T> entityClass,String propertyName, Object value);
	/**
	 * 
	* @Title: findUnique  
	* @Description: 根据参数查询单个对象
	* @param @param entityClass
	* @param @param para
	* @param @return    设定文件  
	* @return T    返回类型  
	* @throws
	 */
	public <T> T findUnique(Class<T>  entityClass,Map<String, Object> para);
	/**
	 * 按属性查找对象列表.
	 */
	public  <T> List<T>  findByProperty(Class<T>  entityClass,String propertyName, Object value);
	/**
	 * 根据实体名称和主键获取实体
	 * 
	 * @param <T>
	 * @param entityName
	 * @param id
	 * @return
	 */
	public <T> T get(Class<T>  class1, Serializable id);
	public void  save(Object entity);
	public  void update(Object entity);
	/**
	 * 更新指定的实体
	 * 
	 * @param <T>
	 * @param pojo
	 */
	public void  updateEntitie(Object pojo, Class<?>... args);
	
	/**
	 * 使用指定的检索标准检索数据并分页返回数据For JDBC
	 */
	public Long getCountForJdbc(String sql);
	/**
	 * 
	* @Title: getCountForJdbc  
	* @Description: 根据参数查询记录条数 
	* @param @param sql
	* @param @param params
	* @param @return    设定文件  
	* @return Long    返回类型  
	* @throws
	 */
	public Long getCountForJdbc(String sql,Map params);
	/**
	 * 通过sql 查询语句查找对象
	 * 
	 * @param <T>
	 * @param query
	 * @return
	 */
	//public <T> List<T> findByQueryString(SQL sql,Class<T>  clazz);
	/**
	 * 
	 * @param sql
	 * @param clazz
	 * @param para
	 * @return
	 */
	//public <T> List<T> findByQueryString(SQL sql,Class<T>  clazz,Map para);
	
	public void delete(Class obj,Object id);
	public int executeSQL(String sql);
	
	/**
	 * 
	* @Title: executeSql  
	* @Description:执行sql 
	* @param @param sql
	* @param @param param
	* @param @return    设定文件  
	* @return Integer    返回类型  
	* @throws
	 */
	public Integer executeSql(String sql, List<Object> param);

	/**
	 * 执行SQL
	 */
	public Integer executeSql(String sql, Object... param);

	/**
	 * 执行SQL 使用:name占位符
	 */
	public Integer executeSql(String sql, Map<String, Object> param);

	/**
	 * 执行SQL 使用:name占位符,并返回执行后的主键值
	 */
	public Object executeSqlReturnKey(String sql, Map<String, Object> param);
	
	/**
	 * 加载全部实体
	 * 
	 * @param <T>
	 * @param entityClass
	 * @return
	 */
	public <T> List<T> loadAll(final Class<T> entityClass);
	/**
	 * 返回easyui datagrid模型
	 * 
	 * @param dataGrid
	 * @param isOffset
	 * @return
	 */
	public DataGrid getDataGridReturn(DataGrid dataGrid,Class clazz,String sql,Map para, boolean isOffset);

	/**
	 * 构建树形数据表
	 * 
	 * @param all
	 * @param treeGridModel
	 * @return
	 */
	public List<TreeGrid> treegrid(List all, TreeGridModel treeGridModel);
	/**
	 * 
	* @Title: batchInsert  
	* @Description: 批量保存
	* @param @param entityClass
	* @param @param list    设定文件  
	* @return void    返回类型  
	* @throws
	 */
	public void batchInsert(Class entityClass,List list);
	
	/**
	 * 通过JDBC查找对象集合 使用指定的检索标准检索数据返回数据
	 */
	public List<Map<String, Object>> findForJdbc(String sql, Map para);
	/**
	 * 
	* @Title: findOneForJdbc  
	* @Description: 查询符合条件的第一条  
	* @param @param sql
	* @param @param para
	* @param @return    设定文件  
	* @return Map<String,Object>    返回类型  
	* @throws
	 */
	public Map<String, Object> findOneForJdbc(String sql, Map para);
	/**
	 * 
	* @Title: deleteBySql  
	* @Description: 根据参数删除数据 
	* @param @param sql
	* @param @param paras    设定文件  
	* @return void    返回类型  
	* @throws
	 */
	public void deleteBySql(String sql, Map paras);
	/**
	 * 
	* @Title: findByQueryString  
	* @Description: 根据参数查询 返回对象  
	* @param @param entityClass
	* @param @param para
	* @param @return    设定文件  
	* @return List<T>    返回类型  
	* @throws
	 */
	public <T> List<T> findByQueryString(Class<T>  entityClass,Map<String, Object> para);
	/**
	 * 
	* @Title: delete  
	* @Description: 删除符合条件的记录 
	* @param @param obj
	* @param @param para    设定文件  
	* @return void    返回类型  
	* @throws
	 */
	public void delete(Class obj, Map<String, Object> para);
	/**
	 * 
	* @Title: delete  
	* @Description: 删除指定属性和值的记录 
	* @param @param obj
	* @param @param propertyName
	* @param @param value    设定文件  
	* @return void    返回类型  
	* @throws
	 */
	public void delete(Class obj, String propertyName, Object value);
	/**
	 * 
	* @Title: getStringListBySql  
	* @Description: 刻录参数查询查询符合条件的指定列名的列表 
	* @param @param obj
	* @param @param selColName 查询的列名
	* @param @param para 参数map
	* @param @param orderCol 排序列
	* @param @param orderBy 排序方式 asc desc
	* @param @return    设定文件  
	* @return List<String>    返回类型  
	* @throws
	 */
	public List<String> getStringListBySql(Class obj, String selColName,Map<String, Object> para,String orderCol,String orderBy);
	/**
	 * 
	* @Title: findByQueryString  
	* @Description: 根据查询条件查询符合条件的对象列表  
	* @param @param sql
	* @param @param entityClass
	* @param @param para
	* @param @return    设定文件  
	* @return List<T>    返回类型  
	* @throws
	 */
	public <T> List<T> findByQueryString(String sql,Class<T>  entityClass,Map<String, Object> para);
	/**
	 * 
	* @Title: findByQueryStringCount  
	* @Description: 根据实体及参数查询符合条件的记录条数
	* @param @param entityClass
	* @param @param para
	* @param @return    设定文件  
	* @return Long    返回类型  
	* @throws
	 */
	public <T> Long findByQueryStringCount(Class<T>  entityClass,Map<String, Object> para);
	/**
	 * 
	* @Title: getStringListBySql  
	* @Description: 根据参数查询单个column的列表  
	* @param @param sql
	* @param @param para
	* @param @return    设定文件  
	* @return List<String>    返回类型  
	* @throws
	 */
	public List<String> getStringListBySql(String sql, Map<String, Object> para);
	/**
	 * 
	* @Title: findOneObjForJdbc  
	* @Description: 根据参数查询单个对象
	* @param @param sql
	* @param @param para
	* @param @param clazz
	* @param @return    设定文件  
	* @return T    返回类型  
	* @throws
	 */
	public <T> T findOneObjForJdbc(String sql, Map para, Class<T> clazz);
	/**
	 * 
	* @Title: selectListByPageSql  
	* @Description:分页获取对象数据 
	* @param @param sql
	* @param @param entityClass
	* @param @param para 
	* (oracle:firstResult 起始行数,maxResults 截至记录行数
	* mysql:beginRow 起始行数,pageSize 每页显示记录数
	* @param page 当前页数
	* @param limit 每页显示条数
	* @param @return    设定文件  
	* @return List<T>    返回类型  
	* @throws
	 */
	public <T> List<T> findForJdbcPage(String sql,Class<T>  entityClass,Map<String, Object> para,int page,int limit);
	/**
	 * 
	* @Title: selectListByPageForMap  
	* @Description: 分页获取记录数，返回list<map> 
	* @param @param sql
	* @param @param para 参数
	* oracle:firstResult 起始行数,maxResults 截至记录行数
	* mysql:beginRow 起始行数,pageSize 每页显示记录数
	* @param @return    设定文件  
	* @return List<Map<String,Object>>    返回类型  
	* @throws
	 */
	public List<Map<String,Object>> findForJdbcMap(String sql,Map<String, Object> para);
	
	public  void updateField(Map<String,Object> paraMap,Map<String,Object> whereMap,Class clazz);
	
	public  void saveField(Map<String,Object> paraMap,Class clazz);
	/**
     * 通过接口获取sql
     *
     * @param mapper
     * @param methodName
     * @param args
     * @return
     */
	public String getMapperSql(Object mapper,String methodName, Object... args);
	/**
	 * 
	* @Title: getMapperSql  
	* @Description: 获取freemaker sql
	* @param @param commandId
	* @param @param model
	* @param @return    参数  
	* @return String    返回类型  
	* @throws
	 */
	public String getMapperSql(String commandId, Map<String, ?> model);
	
	public Integer updateMapper(String sql, Map<String, Object> param);
	public Integer insertMapper(String sql, Map<String, Object> param);
	/**
	 * 
	* @Title: save 
	* @Description: TODO(这里用一句话描述这个方法的作用) 
	* @param @param entity
	* @param @param suffix    表名后缀 
	* @return void    返回类型 
	* @throws
	 */
	public  void save(Object entity,String suffix);
	/**
	 * 
	* @Title: update 
	* @Description: TODO(这里用一句话描述这个方法的作用) 
	* @param @param entity
	* @param @param suffix    表名后缀  
	* @return void    返回类型 
	* @throws
	 */
	public  void update(Object entity,String suffix);
	/**
	 * 
	* @Title: saveMap 
	* @Description: 保存map 
	* @param @param paraMap 字段map
	* @param @param tableName   驼峰表名 
	* @param @param clazz   需要保存的实体class 
	* @return void    返回类型 
	* @throws
	 */
	public  void saveMap(Map<String,Object> paraMap,String tableName,Class clazz);
	/**
	 * 
	* @Title: updateMap 
	* @Description: 修改表通过map
	* @param @param paraMap 字段map
	* @param @param whereMap 修改条件map
	* @param @param tableName    驼峰表名 
	* @param @param clazz   需要保存的实体class  
	* @return void    返回类型 
	* @throws
	 */
	public  void updateMap(Map<String,Object> paraMap,Map<String,Object> whereMap,String tableName,Class clazz);
	
}
